package com.app.utils.redis.aop;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 支持自定义缓存key，默认按照方法和参数生成；<br>
 * 所有接口缓存必须设置过期时间，该参数必须填写不能为空，小于等于0会抛错；<br>
 * 增加缓存类型：短效缓存和长效缓存，该参数必须指定，不能为空；<br>
 * 所有缓存类型，在频繁请求时，都是无缝缓存，只是过期时效不一样；<br>
 * 所有缓存类型，都是触发式更新，频繁请求时，实时更新，非频繁请求时，下一次更新；<br>
 * 短效缓存，没有请求后，过期时效 = 过期时间 * 10；<br>
 * 长效缓存，没有请求后，过期失效 = 12个小时；<br>
 * 当收到请求后，如果缓存有数据立即返回，如果超过过期时间，异步执行方法更新缓存内容，并延长缓存过期时间；<br>
 * 如果缓存没有数据，执行方法，缓存内容，然后返回内容。
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface RedisCache {

	/**
	 * 缓存key 支持自定义
	 */
    String key() default "";

    /**
     * 所有接口缓存必须设置过期时间<br>
     * 该参数必须填写不能为空，小于等于0会抛错
     * 单位秒
     */
    int timeOut() default 60;
    
    /**
     * 短效缓存或长效缓存，该参数必须指定，不能为空；<br>
     * RedisType.Long，没有请求后，过期时效 = 过期时间
     * RedisType.sort，没有请求后，过期时效 = 过期时间 * 10；<br>
     * RedisType.None，没有请求后，过期时效 = 12个小时；
     */
    RedisType type() default RedisType.sort;
}
